package pruebas;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

import juego.Botin;
import juego.Coordenada;
import juego.Energia;
import juego.Impacto;
import juego.Movil;
import juego.Proyectil;
import juego.TorpedoAdaptable;
import junit.framework.TestCase;


public class TestTorpedoAdaptable extends TestCase{

	public void testMovimiento(){
		
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		Coordenada lugar = new Coordenada (0,20);
		Proyectil proyectil = new TorpedoAdaptable(lugar);
		proyectil.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (0, proyectil.verUbicacion().obtenerCoordenadaX());
		assertEquals (30, proyectil.verUbicacion().obtenerCoordenadaY());
		
		proyectil.hacerLeal();
		proyectil.vivir(listaDeMoviles, listaDeBotines);
		assertEquals (0, proyectil.verUbicacion().obtenerCoordenadaX());
		assertEquals (20, proyectil.verUbicacion().obtenerCoordenadaY());
				
	};
	
	public void testImpactoProvocado(){
		
		Coordenada lugar = new Coordenada (0,20);
		Proyectil proyectil = new TorpedoAdaptable(lugar);
		Energia energia = new Energia(10);
		Impacto impacto = proyectil.impactoProvocado();
		impacto.herir(energia);
		assertEquals(5, energia.verEnergia());
	};
	
	public void testFueraDelEscenario(){
		ArrayList<Movil> listaDeMoviles = new ArrayList<Movil>();
		ArrayList<Botin> listaDeBotines = new ArrayList<Botin>();
		
		Coordenada lugar = new Coordenada (404,460);
		TorpedoAdaptable proyectil = new TorpedoAdaptable(lugar);
		listaDeMoviles.add(proyectil);
		
		assertTrue((listaDeMoviles.size() == 1));
		assertTrue(proyectil.estaVivo());
		
		for (int i = 1; i < 4; i++){
			proyectil.vivir(listaDeMoviles,listaDeBotines);
		}
		
		assertTrue((listaDeMoviles.size() == 0));
		assertFalse(proyectil.estaVivo());
	};
	
	
	private static void persistir(String archivo, Proyectil proyectil) {
		try {

			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().newDocument();

			Element element = proyectil.getElement(doc);
			doc.appendChild(element);

			Transformer transformer = TransformerFactory.newInstance()
					.newTransformer();
			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
			transformer.transform(new DOMSource(doc), new StreamResult(
					new PrintStream(archivo)));

		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
	}
	
	private static TorpedoAdaptable recuperar(String archivo) {
		try {
			
			Document doc = DocumentBuilderFactory.newInstance()
					.newDocumentBuilder().parse(new File(archivo));
			Element element = doc.getDocumentElement();

			TorpedoAdaptable proyectil = TorpedoAdaptable.fromElement(element);
			return proyectil;
			
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	
	
	public void testPersistencia() {

		String archivo = "torpedoAdaptable_java.xml";
		TorpedoAdaptable proyectilOriginal = new TorpedoAdaptable(new Coordenada(5,40));
		assertTrue(proyectilOriginal.estaVivo());
		proyectilOriginal.hacerLeal();
		persistir(archivo, proyectilOriginal);
		TorpedoAdaptable proyectilRecuperado = recuperar(archivo);
		assertEquals(5,proyectilRecuperado.getX());
		assertEquals(40,proyectilRecuperado.getY());
		assertTrue(proyectilRecuperado.verLealtad());
		assertTrue(proyectilRecuperado.estaVivo());
		
		proyectilRecuperado.vivir(new ArrayList<Movil>(), new ArrayList<Botin>());
		assertEquals(5,proyectilRecuperado.getX());
		assertEquals(30,proyectilRecuperado.getY());
		assertTrue(proyectilRecuperado.verLealtad());
	}
	

}
